package com.yichuang.security.javajwt.main.common;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JwtTokenProvider {

    // 密钥，最好从配置文件中加载，不要硬编码在代码里
    private static final String SECRET_KEY = "your_secret_key";
    private static final long EXPIRATION_TIME = 3600000; // 1小时过期

    // 生成 JWT Token
    public String generateToken(Authentication authentication) {
        // 使用 RSA 算法加密
        return JWT.create()
                .withSubject(authentication.getName())  // 设置主体
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))  // 设置过期时间
                .sign(Algorithm.HMAC256(SECRET_KEY));  // 使用对称加密方式 HMAC256
    }

    // 从 JWT 获取用户名
    public String getUsernameFromToken(String token) {
        return JWT.require(Algorithm.HMAC256(SECRET_KEY))
                .build()
                .verify(token)
                .getSubject();
    }

    // 验证 JWT 是否有效
    public boolean validateToken(String token) {
        try {
            JWT.require(Algorithm.HMAC256(SECRET_KEY))
                    .build()
                    .verify(token);
            return true;
        } catch (Exception e) {
            // 这里可以捕获如过期等异常，进行相应处理
            return false;
        }
    }

    // 解析 JWT Token
    public DecodedJWT decodeToken(String token) {
        return JWT.require(Algorithm.HMAC256(SECRET_KEY))
                .build()
                .verify(token);
    }
}
